/* 
 * UnidadeBO.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.business.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import br.com.pma.chamatec.business.IUnidadeBO;
import br.com.pma.chamatec.dao.ChamadoDAO;
import br.com.pma.chamatec.dao.UnidadeDAO;
import br.com.pma.chamatec.dao.UnidadeDepartamentoDAO;
import br.com.pma.chamatec.exception.ChamatecExceptionCode;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.entity.Chamado;
import br.com.pma.entity.Departamento;
import br.com.pma.entity.Unidade;
import br.com.pma.entity.UnidadeDepartamento;
import br.com.pma.entity.Usuario;

/**
 * Classe de negócio da entidade Unidade.
 *
 * @author Ludemeula Fernandes de Sá
 */
@Stateless
public class UnidadeBO implements IUnidadeBO {
	@Inject
	private UnidadeDAO unidadeDAO;

	@Inject
	private UnidadeDepartamentoDAO unidadeDepartamentoDAO;

	@Inject
	private ChamadoDAO chamadoDAO;

	/**
	 * @see br.com.pma.chamatec.business.IUnidadeBO#salvar(br.com.pma.entity.Unidade)
	 */
	@Override
	public Unidade salvar(Unidade unidade) throws ChamatecNegocioException {
		validaCamposObrigatorios(unidade);
		validaLista(unidade.getUnidadesDepartamentos());

		Unidade unidadeEncontrada = unidadeDAO.recuperarPorNomeETipo(unidade);
		if (unidadeEncontrada != null && unidadeEncontrada.getId() != null && unidade.getId() != unidadeEncontrada.getId()) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_003);
		}
		unidade = unidadeDAO.merge(unidade);

		return unidade;
	}

	/**
	 * @see br.com.pma.chamatec.business.IUnidadeBO#remover(br.com.pma.entity.Unidade)
	 */
	@Override
	public void remover(Unidade unidade) throws ChamatecNegocioException {
		validarReferencias(unidade);
		unidadeDAO.remove(unidade);
	}

	/**
	 * @see br.com.pma.chamatec.business.IUnidadeBO#getListDescricao()
	 */
	@Override
	public List<Unidade> getListDescricao() throws ChamatecNegocioException {
		return unidadeDAO.getListDescricao();
	}

	/**
	 * @see br.com.pma.chamatec.business.IUnidadeBO#pesquisar(br.com.pma.entity.Unidade, br.com.pma.entity.Usuario)
	 */
	@Override
	public List<Unidade> pesquisar(Unidade unidade, Usuario usuario) throws ChamatecNegocioException {
		List<Unidade> retorno = unidadeDAO.pesquisar(unidade, usuario);
		if (retorno == null || retorno.size() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_001);
		}
		return retorno;
	}

	/**
	 * @see br.com.pma.chamatec.business.IUnidadeBO#addDepartamento(br.com.pma.entity.Unidade, br.com.pma.entity.Departamento)
	 */
	@Override
	public void addDepartamento(Unidade unidade, Departamento departamento) throws ChamatecNegocioException {
		if (departamento == null) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_007);
		}

		if (unidade.getUnidadesDepartamentos() != null || unidade.getUnidadesDepartamentos().size() > 0) {
			if (departamento != null) {
				for (UnidadeDepartamento unidadeDepartamento : unidade.getUnidadesDepartamentos()) {
					if (departamento.getNome().equalsIgnoreCase(unidadeDepartamento.getDepartamento().getNome())) {
						throw new ChamatecNegocioException(ChamatecExceptionCode.ME_009);
					}
				}
			}
		}

		UnidadeDepartamento unidadeDepartamento = new UnidadeDepartamento();
		unidadeDepartamento.setUnidade(unidade);
		unidadeDepartamento.setDepartamento(departamento);
		if (unidade.getUnidadesDepartamentos() == null) {
			unidade.setUnidadesDepartamentos(new ArrayList<UnidadeDepartamento>());
		}
		unidade.getUnidadesDepartamentos().add(unidadeDepartamento);
	}

	/**
	 * @see br.com.pma.chamatec.business.IUnidadeBO#carregarUnidadeEDepartamento(br.com.pma.entity.Unidade)
	 */
	@Override
	public void carregarUnidadeEDepartamento(Unidade unidade) throws ChamatecNegocioException {
		unidade.setUnidadesDepartamentos(unidadeDepartamentoDAO.pesquisarPorUnidade(unidade));
	}

	/**
	 * Realiza a validação dos campos obrigatórios.
	 * 
	 * @param unidade
	 * @throws ChamatecNegocioException
	 */
	private void validaCamposObrigatorios(Unidade unidade) throws ChamatecNegocioException {
		if (unidade.getNome() == null || unidade.getNome().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (unidade.getTipo() == null || unidade.getTipo().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (unidade.getEndereco() == null || unidade.getEndereco().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (unidade.getBairro() == null || unidade.getBairro().getId() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}
	}

	/**
	 * Valida se foi vinculado pelo menos um Departamento a Unidade.
	 * 
	 * @param departamento
	 * @throws ChamatecNegocioException
	 */
	private void validaLista(List<UnidadeDepartamento> lista) throws ChamatecNegocioException {
		if (lista == null || lista.size() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_013);
		}
	}

	/**
	 * Valida as referências de Chamado não deixando excluir um unidade quando existir estas referências.
	 * 
	 * @param unidade
	 * @throws ChamatecNegocioException
	 */
	private void validarReferencias(Unidade unidade) throws ChamatecNegocioException {
		List<Chamado> resultado = chamadoDAO.pesquisarPorUnidade(unidade);
		if (resultado != null && resultado.size() > 0)  {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_018);
		}
	}
}